// utils/date.js - 日期时间处理工具

/**
 * 格式化日期时间
 * @param {Date|string|number} date 日期对象、日期字符串或时间戳
 * @param {string} format 格式字符串，例如：YYYY-MM-DD HH:mm:ss
 * @returns {string} 格式化后的日期字符串
 */
export const formatDate = (date, format = 'YYYY-MM-DD HH:mm:ss') => {
  if (!date) return '';
  
  // 转换为Date对象
  if (typeof date === 'string' || typeof date === 'number') {
    date = new Date(date);
  }
  
  if (!(date instanceof Date) || isNaN(date.getTime())) {
    return '';
  }
  
  const year = date.getFullYear();
  const month = String(date.getMonth() + 1).padStart(2, '0');
  const day = String(date.getDate()).padStart(2, '0');
  const hours = String(date.getHours()).padStart(2, '0');
  const minutes = String(date.getMinutes()).padStart(2, '0');
  const seconds = String(date.getSeconds()).padStart(2, '0');
  const milliseconds = String(date.getMilliseconds()).padStart(3, '0');
  
  return format
    .replace(/YYYY/g, year)
    .replace(/YY/g, String(year).slice(2))
    .replace(/MM/g, month)
    .replace(/M/g, String(date.getMonth() + 1))
    .replace(/DD/g, day)
    .replace(/D/g, String(date.getDate()))
    .replace(/HH/g, hours)
    .replace(/H/g, String(date.getHours()))
    .replace(/mm/g, minutes)
    .replace(/m/g, String(date.getMinutes()))
    .replace(/ss/g, seconds)
    .replace(/s/g, String(date.getSeconds()))
    .replace(/SSS/g, milliseconds);
};

/**
 * 获取当前日期时间
 * @param {string} format 格式字符串
 * @returns {string} 格式化的当前日期时间
 */
export const now = (format = 'YYYY-MM-DD HH:mm:ss') => {
  return formatDate(new Date(), format);
};

/**
 * 获取今天日期
 * @param {string} format 格式字符串
 * @returns {string} 格式化的今天日期
 */
export const today = (format = 'YYYY-MM-DD') => {
  return formatDate(new Date(), format);
};

/**
 * 获取明天日期
 * @param {string} format 格式字符串
 * @returns {string} 格式化的明天日期
 */
export const tomorrow = (format = 'YYYY-MM-DD') => {
  const date = new Date();
  date.setDate(date.getDate() + 1);
  return formatDate(date, format);
};

/**
 * 获取昨天日期
 * @param {string} format 格式字符串
 * @returns {string} 格式化的昨天日期
 */
export const yesterday = (format = 'YYYY-MM-DD') => {
  const date = new Date();
  date.setDate(date.getDate() - 1);
  return formatDate(date, format);
};

/**
 * 获取日期的时间戳
 * @param {Date|string|number} date 日期对象、日期字符串或时间戳
 * @returns {number} 时间戳（毫秒）
 */
export const getTimestamp = (date = new Date()) => {
  if (date instanceof Date) {
    return date.getTime();
  }
  return new Date(date).getTime();
};

/**
 * 计算两个日期之间的差值
 * @param {Date|string|number} date1 日期对象、日期字符串或时间戳
 * @param {Date|string|number} date2 日期对象、日期字符串或时间戳
 * @param {string} unit 差值单位：days/hours/minutes/seconds/milliseconds
 * @returns {number} 差值
 */
export const dateDiff = (date1, date2, unit = 'days') => {
  const d1 = new Date(date1).getTime();
  const d2 = new Date(date2).getTime();
  const diff = Math.abs(d1 - d2);
  
  switch (unit) {
    case 'days':
      return Math.floor(diff / (1000 * 60 * 60 * 24));
    case 'hours':
      return Math.floor(diff / (1000 * 60 * 60));
    case 'minutes':
      return Math.floor(diff / (1000 * 60));
    case 'seconds':
      return Math.floor(diff / 1000);
    case 'milliseconds':
    default:
      return diff;
  }
};

/**
 * 获取相对时间描述
 * @param {Date|string|number} date 日期对象、日期字符串或时间戳
 * @returns {string} 相对时间描述
 */
export const fromNow = (date) => {
  const now = new Date().getTime();
  const timestamp = new Date(date).getTime();
  const diff = now - timestamp;
  
  // 小于1分钟
  if (diff < 60 * 1000) {
    return '刚刚';
  }
  
  // 小于1小时
  if (diff < 60 * 60 * 1000) {
    return `${Math.floor(diff / (60 * 1000))}分钟前`;
  }
  
  // 小于1天
  if (diff < 24 * 60 * 60 * 1000) {
    return `${Math.floor(diff / (60 * 60 * 1000))}小时前`;
  }
  
  // 小于30天
  if (diff < 30 * 24 * 60 * 60 * 1000) {
    return `${Math.floor(diff / (24 * 60 * 60 * 1000))}天前`;
  }
  
  // 小于12个月
  if (diff < 12 * 30 * 24 * 60 * 60 * 1000) {
    return `${Math.floor(diff / (30 * 24 * 60 * 60 * 1000))}个月前`;
  }
  
  // 大于等于12个月
  return `${Math.floor(diff / (12 * 30 * 24 * 60 * 60 * 1000))}年前`;
};

/**
 * 检查日期是否有效
 * @param {Date|string|number} date 日期对象、日期字符串或时间戳
 * @returns {boolean} 是否有效
 */
export const isValidDate = (date) => {
  const d = new Date(date);
  return d instanceof Date && !isNaN(d.getTime());
};

/**
 * 添加时间
 * @param {Date|string|number} date 日期对象、日期字符串或时间戳
 * @param {number} amount 添加的数量
 * @param {string} unit 单位：years/months/days/hours/minutes/seconds
 * @returns {Date} 新的日期对象
 */
export const addTime = (date, amount, unit = 'days') => {
  const d = new Date(date);
  
  switch (unit) {
    case 'years':
      d.setFullYear(d.getFullYear() + amount);
      break;
    case 'months':
      d.setMonth(d.getMonth() + amount);
      break;
    case 'days':
      d.setDate(d.getDate() + amount);
      break;
    case 'hours':
      d.setHours(d.getHours() + amount);
      break;
    case 'minutes':
      d.setMinutes(d.getMinutes() + amount);
      break;
    case 'seconds':
      d.setSeconds(d.getSeconds() + amount);
      break;
  }
  
  return d;
};

export default {
  formatDate,
  now,
  today,
  tomorrow,
  yesterday,
  getTimestamp,
  dateDiff,
  fromNow,
  isValidDate,
  addTime
};